package com.gome.security.util.SHA;
import java.security.MessageDigest;  
import java.security.Security;  
import org.bouncycastle.jce.provider.BouncyCastleProvider;  
import org.bouncycastle.util.encoders.Hex;  
/** 
 * bouncy castle 关于SHA224的消息摘要实现 
 * @author kongqz 
 * 
 * 1、sun提供了底层的sha算法实现，缺少sha-224算法，而且无法做进制转换
2、bouncy castle对sun进行了补充，提供了sha-224算法以及16进制的字符串的摘要信息，比较方便
3、commons codec对sun的sha算法可以进行包装，并且支持十六进制字符串形式的摘要信息，相当方便。
 * **/  
public class SHA224Coder {  
    /** 
     * SHA-224 的消息摘要算法实现 
     * @param data 待处理的数据 
     * @return byte[] 消息摘要 
     *  
     * */  
    public static byte[] encodeSHA224(byte[] data) throws Exception{  
          
        //加入对bouncy castle的支持  
        Security.addProvider(new BouncyCastleProvider());  
        //初始化MessageDigest  
        MessageDigest md=MessageDigest.getInstance("SHA-224");  
        //执行消息摘要处理  
        return md.digest(data);  
    }  
    /** 
     * SHA-224 的消息摘要算法实现 
     * @param data 待处理的数据 
     * @return String 十六进制的消息摘要 
     * @author kongqz 
     * */  
    public static String encodeSHA224Hex(byte[] data) throws Exception{  
          
        //执行消息摘要处理  
        byte[] b=encodeSHA224(data);  
          
        return new String (Hex.encode(b));  
    }  
    public static void main(String[] args) throws Exception {  
        String str="BouncyCast支持的SHA224 消息摘要算法";  
        System.out.println("原文："+str);  
        byte[] data1=SHA224Coder.encodeSHA224(str.getBytes());  
        System.out.println("SHA-224的消息摘要算法值："+data1.toString());  
          
        String data2=SHA224Coder.encodeSHA224Hex(str.getBytes());  
        System.out.println("SHA-224 转十六进制的消息摘要算法值："+data2);  
    }  
} 
